﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2021_5_14
{
    
    class Program
    {
        public static int[] arr = new int[5];
        #region 1、编写程序，定义一个枚举类型，表示订单的状态值：新订单、已发货、已签收、已评价；
        enum orderStatus
        {
            新订单,
            已发货,
            已签收,
            已评价
        }
        #endregion

        #region 2、有一款叫做“切水果”的游戏，里面有各种各样的水果，
        //A、现在请定义一个叫做“fruit”的枚举类型，里面有：香蕉、苹果、西瓜、草莓、葡萄、哈密瓜、奇异果。
        public enum fruit
        {
            哈密瓜 = 3,
            西瓜,
            奇异果,
            香蕉,
            苹果,
            草莓,
            葡萄
        }
        #endregion

        #region 3、RPG游戏中，通常有不同的职业，比如“战士”、“法师”、“精灵”等等职业，
        //A、现在请定义一个游戏职业的枚举。
        public enum job
        { 
            战士,
            法师,
            精灵
        }
        #endregion

        static void Main(string[] args)
        {
            #region 获得数组的最大值，最小值，和，平均值
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine("请输入第{0}个数，共5个数：",i+1);
                arr[i] = int.Parse(Console.ReadLine());
            }
            
            int max = arr[0];
            int min = arr[0];
            int sum = arr[0];
            double avg = arr[0];

            //ref是把传参方法变为地址传递（数组的传递方法），这种情况下，被传过去的是变量的内存地址，
            //只要在方法中，变量的数值被改变，那么在其它位置的那个变量也会被改变。
            #region 使用ref的方法 
            sum = GetValueOnRef(ref max,ref min,ref avg);
            Console.WriteLine("[ref]该数组的最大值为:{0},最小值为:{1},和为:{2},平均值为:{3}",max,min,sum,avg);
            #endregion

            //out是把经过方法变更后的数据带出来，在赋值给变量，这种情况下，变量在经过方法之前的值是什么，或者有没有
            //都不重要，反正经过方法后都会被覆盖，也因为out不关心变量之前的值是什么，
            //所以使用out传递的参数在方法对它有操作（赋值）之前，在那个方法中是无法使用的，
            //而且在离开该方法之前，必须要给带有out的变量赋值。
            #region 使用out的方法
            sum = GetValueOnOut(out max, out min, out avg);
            Console.WriteLine("[out]该数组的最大值为:{0},最小值为:{1},和为:{2},平均值为:{3}\n", max, min, sum, avg);
            #endregion
            #endregion

            #region 字符串判空
            Console.WriteLine("当输入为\"\"时，方法返回的值：" + StringUtil.IsNull(""));
            Console.WriteLine("当输入为\"\t\"时，方法返回的值：" + StringUtil.IsNull("     "));
            Console.WriteLine("当输入为\"true + \"  \"\"时，方法返回的值：" + StringUtil.IsNull("true  "));
            Console.WriteLine();
            #endregion

            #region 数组判空
            string[] arrLen0 = new string[0];
            string[] arrNull = { "null" };
            string[] arrStr = { "1" };
            Console.WriteLine("数组长度为0时，方法返回的值："+ ArraysUtil.IsNull(arrLen0));
            Console.WriteLine("数组为null，方法返回的值：" + ArraysUtil.IsNull(arrNull));
            Console.WriteLine("数组不为空，，方法返回的值：" + ArraysUtil.IsNull(arrStr));
            Console.WriteLine();
            #endregion

            #region 静态字段作业
            Student stu1 = new Student("孙悟空");
            Student stu2 = new Student("猪八戒");
            Student stu3 = new Student("沙和尚");
            Student stu4 = new Student("白龙马");

            stu1.SelfIntroduction();
            stu2.SelfIntroduction();
            stu3.SelfIntroduction();
            stu4.SelfIntroduction();

            Student.ShiftTeacher();

            stu1.SelfIntroduction();
            stu2.SelfIntroduction();
            stu3.SelfIntroduction();
            stu4.SelfIntroduction();

            Console.WriteLine();
            #endregion

            #region 枚举作业1
            //1、声明一个枚举类型表示某个订单的状态并将其值输出。
            orderStatus order = orderStatus.已发货;
            Console.WriteLine(order);
            #endregion

            #region 枚举作业2
            fruit fruit = fruit.葡萄;
            PrintScore(fruit);
            Console.WriteLine();
            #endregion

            #region 枚举作业3
            Program.PrintSkill(job.战士);
            Program.PrintSkill(job.法师);
            Program.PrintSkill(job.精灵);
            Console.WriteLine();
            #endregion
        }
        #region 定义一个方法，求一个整数数组中的最大值，最小值，和，平均数。
        #region ref
        public static int GetValueOnRef(ref int max ,ref int min ,ref double avg)
        {
            int sum = 0;

            for (int i = 0; i < arr.Length; i++)
            {
                if (min > arr[i])
                {
                    min = arr[i];
                }
                else if (max < arr[i])
                {
                    max = arr[i];
                }

                sum += arr[i];
            }

            avg = sum / (double)arr.Length;

            return sum;
        }
        #endregion
        #region out
        public static int GetValueOnOut(out int max , out int min , out double avg)
        {
            int sum = 0;
            max = arr[0];
            min = arr[0];
            avg = arr[0];

            for (int i = 0; i < arr.Length; i++)
            {
                sum += arr[i];

                if (min > arr[i])
                {
                    min = arr[i];
                }
                else if (max < arr[i])
                {
                    max = arr[i];
                }
            }
            
            avg = sum / (double)arr.Length;

            return sum;
        }
        #endregion
        #endregion

        #region 2、B、然后定义一个输出水果分数的方法，参数类型就是这个水果枚举，方法中根据不同的枚举值，输出水果对应的分数（可以参考切水果游戏）。注：水果形状越小，切到的时候分数就越高。
        public static void PrintScore(fruit fruit)
        {
            int score = (int)fruit;
            Console.WriteLine("{0}的分数为{1}",fruit,score);
        }
        #endregion

        #region 3、B、然后定一个输出职业技能的方法，根据传入的职业枚举的值来输出，
        public static void PrintSkill(job job)
        {
            switch (job)
            {
                case job.战士:
                    Console.WriteLine("战士的技能：碎石打击、烈焰锚钩、战斗咆哮");
                    break;
                case job.法师:
                    Console.WriteLine("法师的技能：巨浪冲击、元素突击、复仇杀戮");
                    break;
                case job.精灵:
                    Console.WriteLine("精灵的技能：减速陷阱、能量浪潮、旋风剑舞");
                    break;
            }
        }
        #endregion

    }
}
